package com.xxzb.pack0824.线程池;

import java.util.concurrent.*;

public class 自定义线程池 {
    public static void main(String[] args) {
        /**
         * 参数1：核心线程数(核心线程数指初始化线程数量，核心线程数不会被释放)
         * 参数2：最大线程数(允许创建的最大线程数)
         * 参数3：最大空闲时间(当一个非核心线程空闲时间到达指定的时间后，自动释放)
         * 参数4：最大空闲时间的时间单位
         * 参数5：阻塞队列，当核心线程数正在被使用时，新提交的任务会添加到阻塞队列中
         * 参数6：线程工厂，使用线程工厂创建线程池中的线程
         * 参数7：拒绝策略（4种）
         *      ThreadPoolExcutor.AbortPolicy():异常策略，当有新任务提交无法处理时报异常
         *      ThreadPoolExcutor.CallerRunsPolocy():调用者处理策略，由于线程已满无法继续处理新任务，此策略表示，谁提交的任务谁处理
         *      ThreadPoolExcutor.DiscardPolicy():丢弃策略，线程池无法处理新任务时，直接将新提交的任务丢弃
         *      ThreadPoolExcutor.DiscardOldestPolicy():替换策略，线程池无法处理新任务时，如果有新任务提交，则将队列中排队最久的任务丢弃，替换为新提交的任务
         *
         */
        //创建一个基于数组的阻塞队列
        ArrayBlockingQueue arrayBlockingQueue=new ArrayBlockingQueue(1);
        //使用自定义线程池创建一个线程池对象
        ExecutorService executorService=new ThreadPoolExecutor(
                1,//核心线程数
                2,//最大线程数
                1000,
                TimeUnit.MILLISECONDS,
                arrayBlockingQueue,
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );
        for (int i = 0; i < 5; i++) {
            final int temp=1;
            executorService.submit(()->{
                for (int j = 0; j < 10; j++) {
                    System.out.println(Thread.currentThread().getName()+":"+temp);
                }
            });
        }
    }
}
